<?php
/**
 * @author 		 Faithsmine
 * @copyright  lzchinese.com	
 * @version 	 1.3
 * @name 		 func.class.php
 * @todo 		     Define the common function class
 * @final 		    2012-03-16
 */

/**
 * 通用函数处理方法
 *
 */
class func
{
	/**
	 * @todo getFocusRList
	 * */
	public static function getFrontCache($cacheName){
		if(is_file(DIR_CACHE .'front/'.$cacheName.'.php')){
			echo file_get_contents(DIR_CACHE .'front/'.$cacheName.'.php');
		}else {
			echo '';
		}
		return ;
	}
    /**
     * 对数组内每一个元素进行adsslashes操作
     *
     * @param array $array
     */
    public static function adsslashesArray(&$array)
    {
		if($array)
		{
		    foreach ($array as $key => $value)
		    {
	            if (!is_array($value))
	            {
					$array[$key] = addslashes($value);
			    }
			    else
			    {
					self::adsslashesArray($array[$key]);
			    }
		    }
		}
		return $array;
    }

    /**
     * 对数组内每一个元素进行stripslashes操作
     *
     * @param array $array
     */
    public static function stripslashesArray(&$array)
    {
		if($array)
		{
			foreach ($array as $key => $value)
			{
			    if (!is_array($value))
			    {
					$array[$key] = stripslashes($value);
			    }
			    else
			    {
					self::stripslashesArray($array[$key]);
			    }
			}
		}
		return $array;
    }

    /**
     * 获取客户端IP地址
     *
     * @return string
     */
    public static function remoteAddr()
    {
		if ($_SERVER['HTTP_CLIENT_IP'])
		{
		    $onlineip = $_SERVER['HTTP_CLIENT_IP'];
		}
		else if ($_SERVER['HTTP_X_FORWARDED_FOR'])
		{
		    $onlineip = $_SERVER['HTTP_X_FORWARDED_FOR'];
		}
		else
		{
		    $onlineip = $_SERVER['REMOTE_ADDR'];
		}
		return $onlineip;
    }

    /**
     * 跳转到指定的网址
     *
     * @param string $URL
     */
    public static function obHeader($URL)
    {
		if (!headers_sent())
		{
		    header("Location: $URL");
		}
		else
		{
		    echo "<meta http-equiv='refresh' content='0;url=$URL'>";
		}
		exit;
    }
    /**
     * 跳转到指定的网址
     *
     * @param string $URL
     */
	public static function showMsg($msg, $url = "") {
		echo '<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />';
		echo "<div style='text-align:center;'>";
		echo $msg;
		echo "<br>页面跳转中……";
		echo "<br><a href='$url' >如果你的浏览器没有跳转，请点这里手动跳转</a></div>";
		echo "<script>setTimeout(function(){location.href='$url';},14000);</script>";
		exit ();
	}
    /**
     * alert 提示后，跳转到指定的网址
     *
     * @param string $URL
     */      
    function alertMsg($msg, $url='')
    {
		echo '<meta http-equiv="Content-Type" content="text/html; charset='.CHARSET.'" />';
		if($url)
		{
		    echo "<script type='text/javascript'>alert('".$msg."');document.location='".$url."';</script>";
		}
		else
		{
		    echo "<script type='text/javascript'>alert('".$msg."');history.back();</script>";
		}
		exit();
    } 

    /**
     * 设置 cookie
     *
     * @param string $name, $value, $time
     * @return bool
     */
    public static function setCookieValue($name, $value, $time, $path = '/', $domain = "")
    {
		setcookie($name, $value, time()+$time, $path, $domain);
    }
     /**
     * 清楚 cookie
     *
     * @param string $name
     * @return bool
     */
    public static function clearCookieValue($name, $path = '/', $domain = "")
    {
		setcookie($name, "", 0, $path, $domain);
    }
    /**
     * pass密钥
     */
    public static function passkeyEncode($key)
    {
		return md5($key . PASSKEY);
    }

    /**
     * 判断是否是email
     *
     * @param string $email
     * @return bool
     */
    public static function isEmail($email)
    {
		if(preg_match("/^\w{1,64}@\w{1,64}.\w{1,3}(.\w{1,3})?$/", $email)) {
		    return true;
		} else {
		    return false;
		}
    }
    /**
     * 函数名：CheckTelephone($C_telephone)
     * 作 用：判断是否为合法电话号码
     *
     * 参 数：$C_telephone（待检测的电话号码）
     * 返回值：布尔值
     * 备 注：无
     *
     **/
    function isTelephone($C_telephone)
    {
		if (!ereg("^[+]?[0-9]+([xX-][0-9]+)*$", $C_telephone))
		{
		    return false;
		}
		else
		{
		    return true;
		}
    } 
    /**
     * 函数名：checkpost($c_post)
     * 作 用：判断是否为合法邮编（固定长度）
     *
     * 参 数：$C_post（待check的邮政编码）
     * 返回值：布尔值
     * 备 注：无
     *
     **/
    function isPostCode($strPostCode)
    {
		if (strlen($strPostCode) == 6)
		{
		    if (!ereg("^[+]?[_0-9]*$",$strPostCode))
		    {
				return false;
		    }
		    else
		    {
				return true;
		    }
		}
		else
		{
		    return false;
		}
    } 

    /**
     * 判断是否是URL
     *
     * @param string $url
     * @return bool
     */
    public static function isUrl($url)
    {
		if (!ereg("^http://[_a-zA-Z0-9-]+(.[_a-zA-Z0-9-]+)*", $url))
		{
		    return false;
		}
		else
		{
		    return true;
		}
    }

    /**
     * 判断给定日期字符串是否是合法日期
     *
     * @param string $strDate	格式形如YYYY-mm-dd
     * @return bool
     */
    public static function isDate($strDate)
    {
		if (strlen($strDate) < 1)
		{
		    return false;
		}
		$iaMonthDays = array(31,28,31,30,31,30,31,31,30,31,30,31);
		$iaDate = explode("-", $strDate);
	
		if (count($iaDate) != 3)
		{
		    return false;
		}
		
		if (strlen($iaDate[1]) > 2 || strlen($iaDate[2]) > 2)
		{
		    return false;
		}
		
		$year   = intval($iaDate[0]);
		$month  = intval($iaDate[1]);
		$day	= intval($iaDate[2]);
	
		if (!$year || !$month || !$day)
		{
		    return false;
		}
	
		if ($year < 1900 || $year > 2100)
		{
		    return false;
		}
		
		if ((($year % 4 == 0) && ($year % 100 != 0)) || ($year % 400 == 0))
		{
		    $iaMonthDays[1] = 29;
		}
		
		if ($month < 1 || $month > 12)
		{
		    return false;
		}
		
		if ($day < 1 || $day > $iaMonthDays[$month - 1])
		{
		    return false;
		}
		return true;
    }

    /**
     * 判断给定的时间字符串转化为多少秒前
     * @param string $strTime	time()
     * @return string
     *
     */
    public static function trTime($strTime)
    {
		$isTime = time() - $strTime;
		if($isTime < 60)
		{
		    return $isTime .'秒前';
		}
		elseif($isTime < 3600)
		{
		    $isTime = $isTime/60;
		    return (int)($isTime) .'分钟前';
		}
		elseif($isTime < 86400)
		{
		    $isTime = $isTime/3600; 
		    return (int)($isTime) .'小时前';
		}
		elseif($isTime < 2592000)
		{
		    $isTime = $isTime/86400;
		    return (int)($isTime) .'天前';
		}
		elseif($isTime > 2592000)
		{
		    $strTime = date("Y-m-d H:i:s", $strTime);
		    return self::trDate($strTime);
		}
    }

    /**
     * 判断给定的时间字符串是否是合法时间
     * @param string $strDate	time()
     * @return string
     *
     */
    public static function trDate($strDate)
    {
		$temp = explode(" ", $strDate);
		if (isset($temp[0]))
		{
		    $tempArray = explode("-", $temp[0]);	    
		    return $tempTime = $tempArray[0] . '年' . $tempArray[1] . '月' .  $tempArray[2] . '日 ' . $temp[1];
		}
		else
		{
		    return $strDate;
		}
    }

    /**
     * 判断给定的时间字符串是否是合法时间
     * @param string $strTimeString	格式形如hh:nn:ss
     * @return bool
     */
    public static function isTime($strTimeString)
    {
		if (strlen($strTimeString) < 1)
		{
		    return false;
		}
	
		$tempArray = explode(":", $strTimeString);
	
		!isset($tempArray[1]) && $tempArray[1] = 0;
		!isset($tempArray[2]) && $tempArray[2] = 0;
		
		$temph = intval($tempArray[0]);
		$tempm = intval($tempArray[1]);
		$temps = intval($tempArray[2]);
	
		if (!$temph || !$tempm || !$temps)
		{
		    return false;
		}
		
		if ($temph < 0 || $temph > 23)
		{
		    return false;
		}
		if ($tempm < 0 || $tempm > 59)
		{
		    return false;
		}
		if ($temps < 0 || $temps > 59)
		{
		    return false;
		}
		return true;
    }

    /**
     * 判断给定的日期时间字符串是否合法
     * @param string $strDateTime	形如 YYYY-mm-dd hh:ii:ss
     * @return bool
     */
    public static function isDateTime($strDateTime)
    {
		if (strlen($strDateTime) < 5)
		{
		return false;
		}
		
		$tempArray = explode(" ", $strDateTime);
		$tempDate = $tempArray[0];
		if (isset($tempArray[1]))
		{
		    $tempTime = $tempArray[1];
		}
		else
		{
		    $tempTime = "00:00:00";
		}
	
		if (self::isDate($tempDate) && self::isTime($tempTime))
		{
		    return true;
		}
		else
		{
		    return false;
		}
    }

    /**
     * 日期间隔
     *
     * @param string $diffday 间隔天数
     * @return 2006-09-09
     */
    function diffDay($day, $diffday = 0)
    {
		if($day)
		{
		    $arrday = array();
		    $arrday = split("-", $day);
		    $endday = @mktime(00,00,00,$arrday[1],$arrday[2],$arrday[0]);
		    $diffday = $diffday * 86400;
		    $day = date("Y-m-d", $endday + $diffday);
		}
		return $day;
    }

    /**
     * 两时间间隔
     *
     * @param string $time 格式 00:00
     * @return 秒数 
     */
    function diffTime($timeone, $timetwo = 0)
    {
		if($timeone)
		{
		    $arrtimeone = array();
		    $arrtimeone = split(":", $timeone);
		    $arrtimetwo = array();
		    $arrtimetwo = split(":", $timetwo);
		    $one = gmmktime($arrtimeone[0], $arrtimeone[1]);  
		    $two = gmmktime($arrtimetwo[0], $arrtimetwo[1]); 
		    $timeone = $two - $one;
		}
		return $timeone;
    }
	
    /**
     * 变换日期格式 eg:2006-9-9 => 2006-09-09
     *
     * @param string $string:2006-9-9
     * @return 2006-09-09
     */
    function trDay($trday)
    {
		$arrday = array();
		$arrday = split("-", $trday);
		if (strlen($arrday[1]) == 1) $arrday[1] = "0". $arrday[1];
		if (strlen($arrday[2]) == 1) $arrday[2] = "0". $arrday[2];
		$trday = implode("-", $arrday);
		return $trday;
    }

    /**
     * 将给定的由特定符号分隔开的字符串过滤掉空白字符
     * @param string $sep	        分隔字符串
     * @param string $strList	给定的字符串
     * @param string $strRet	
     */
    public static function trimSep($sep, $strList)
    {
		$strArray = explode($sep, $strList);
		$strRet = "";
		if ($strArray)
		{
		    foreach ($strArray as $keyid => $item)
		    {
				$strArray[$keyid] = trim($item);
		    }
		    $strArray = array_unique($strArray);
		    $strRet = implode($sep, $strArray);
	    }
		return $strRet;
    }

    /**
     * 将图像转换为另给定的尺寸 同比例缩放
     * @param string $strFile	图像文件名
     * @param int $toW, $toH	要转换为的宽和高
     * @param string $toFile	另存为的文件名，如果为空，则覆盖原文件
     */
    function imageResize($srcFile, $toW, $toH, $toFile="")
    {
		if ($toFile == "")
		{
		    $toFile = $srcFile;
		}
		$info = "";
		$data = GetImageSize($srcFile, $info);
		switch ($data[2])
		{
			case 1:
				if (!function_exists("imagecreatefromgif"))
				{
					return "您的GD库不能使用GIF格式的图片，请使用JPEG或PNG格式！";
				}
				$im = ImageCreateFromGIF($srcFile);
				break;
			case 2:
				if (!function_exists("imagecreatefromjpeg"))
				{
					return "您的GD库不能使用JPEG格式的图片，请使用其它格式的图片！";
				}
				$im = ImageCreateFromJpeg($srcFile);   
				break;
			case 3:
				$im = ImageCreateFromPNG($srcFile);   
				break;
		}
		$srcW = ImageSX($im);
		$srcH = ImageSY($im);
		$toWH = $toW/$toH;//200/200
		$srcWH = $srcW/$srcH;//200/100
		
		if ($toWH <= $srcWH)
		{
			if($toW < $srcW)
			{
				$ftoW = $toW;
				$ftoH = $ftoW*($srcH/$srcW);
			}
			else
			{
				$ftoW = $srcW;
				$ftoH = $srcH;
			}
		}
		else
		{	
			if($toH < $srcH)
			{
				$ftoH = $toH;
				$ftoW = $ftoH*($srcW/$srcH);
			}
			else
			{
				$ftoW = $srcW;
				$ftoH = $srcH;
			}
		}
		if (function_exists("imagecreatetruecolor"))
		{
			@$ni = ImageCreateTrueColor($ftoW, $ftoH);
			if ($ni)
				ImageCopyResampled($ni, $im, 0, 0, 0, 0, $ftoW, $ftoH, $srcW, $srcH);
			else
			{
				$ni=ImageCreate($ftoW,$ftoH);
				ImageCopyResized($ni,$im,0,0,0,0,$ftoW,$ftoH,$srcW,$srcH);
			}
		}
		else
		{
			$ni=ImageCreate($ftoW,$ftoH);
			ImageCopyResized($ni, $im, 0, 0, 0, 0, $ftoW, $ftoH, $srcW, $srcH);
		}
		if (function_exists('imagejpeg')) 
			ImageJpeg($ni, $toFile, 80);
		else ImagePNG($ni, $toFile, 80);
		ImageDestroy($ni);
		ImageDestroy($im);
		return true;
    }
     /**
     * 将图像转换为另给定的尺寸 尺寸定死，不再同比例缩放。
     * @param string $strFile	图像文件名
     * @param int $toW, $toH	要转换为的宽和高
     * @param string $toFile	另存为的文件名，如果为空，则覆盖原文件
     */   
    function imageIsResize($srcFile, $toW, $toH, $toFile="")
    {
		if ($toFile == "")
		{
			$toFile = $srcFile;
		}
		$info = "";
		$data = GetImageSize($srcFile, $info);
		switch ($data[2])
		{
			case 1:
				if (!function_exists("imagecreatefromgif"))
				{
					return "您的GD库不能使用GIF格式的图片，请使用JPEG或PNG格式！";
				}
				$im = ImageCreateFromGIF($srcFile);
				break;
			case 2:
				if (!function_exists("imagecreatefromjpeg"))
				{
					return "您的GD库不能使用JPEG格式的图片，请使用其它格式的图片！";
				}
				$im = ImageCreateFromJpeg($srcFile);   
				break;
			case 3:
				$im = ImageCreateFromPNG($srcFile);   
				break;
		}
		$srcW = ImageSX($im);
		$srcH = ImageSY($im);
		$ftoW = $toW;
		$ftoH = $toH;
		if (function_exists("imagecreatetruecolor"))
		{
			@$ni = ImageCreateTrueColor($ftoW, $ftoH);
			if ($ni)
				ImageCopyResampled($ni, $im, 0, 0, 0, 0, $ftoW, $ftoH, $srcW, $srcH);
			else
			{
				$ni=ImageCreate($ftoW,$ftoH);
				ImageCopyResized($ni,$im,0,0,0,0,$ftoW,$ftoH,$srcW,$srcH);
			}
		}
		else
		{
			$ni=ImageCreate($ftoW,$ftoH);
			ImageCopyResized($ni, $im, 0, 0, 0, 0, $ftoW, $ftoH, $srcW, $srcH);
		}
		if (function_exists('imagejpeg')) 
			ImageJpeg($ni, $toFile, 80);
		else ImagePNG($ni, $toFile, 80);
		ImageDestroy($ni);
		ImageDestroy($im);
		return true;
    }

    /**
     * 图片上传错误验证
     * @param string $strFile	图像文件名
     * @param int $toW, $toH	要转换为的宽和高
     * @param string $toFile	另存为的文件名，如果为空，则覆盖原文件
     */
    function errorUploadImage($files, $size = 2000000, $filesclass = 'image')
    {
		$sizeView = $size / (1000 * 1000) . 'M';
		$sizeView < 1 && $sizeView = $size / 1000 . 'K';
		$error = '';
		if (empty($files["name"]))
		{
		    $error = "您未选择任何文件";
		}
		else if ($files["error"] == 1 || $files["error"] == 2)
		{
		    $error = "文件太大了";
		}
		else if ($files["error"] == 3 || $files["error"] == 4)
		{
		    $error = "文件上传错误，请重新上传";
		}
		else if ($files["size"] > $size)
		{
		    $error = "文件太大了，不能超过".$sizeView;
		}
		if ($filesclass = 'image')
		{
		    if (!in_array($files["type"], array("image/gif", "image/jpeg", "image/pjpeg", "image/png", "image/x-png")))
		    {
				$error = $files["type"] . " 您上传的图像文件不属于GIF、JPG、PNG中的任何一种";
		    }
		}
		if ($error)
		{
		    self::alertMsg($error);
		}
    }

    //生成 并 获取路径的方法 操作目录文件，递归删除，目录大小的统计

    /**
     * 获取文件路径的方法   
     * 注意 $userId 1 为数字 2 需要大约1000
     * @param int $userId ID数字 
     * @return string 路径  例如ID=1233 返回路径 1/1233/$classfile/  
     * @author supfire
     * @final 2008-08-05
     */
    function getFilePath($id, $classfile = '', $prefixpath = '')
    {
		$id = strval($id);
		$path = $prefixpath . substr($id, 0, (strlen($id)-3)) . '/' . $id . '/' . $classfile . '/';
		return $path;
    }

    /**
     *  返回用户的路径。如果不存在，则创建
     */
    function getFilePath2($id, $prefixpath, $classfile = '')
    {
        $id = strval($id);
        $path = $prefixpath . substr($id, 0, (strlen($id)-3));
        //echo "path=$path<br>";
        if(!file_exists($path)){
            @mkdir($path);
        }

        $path .= "/" . $id;
        //echo "path=$path<br>";
        if(!file_exists($path)){
            @mkdir($path);
        }

        if (strlen($classfile) > 0)
        {
            $path .= "/" . $classfile;
            if(!file_exists($path)){
                @mkdir($path);
            }
        }

        $path .= "/";

        return $path;
    }

    
    /**
     *  在指定的文件中,增加或修改指定的数据
     *      注意：key不能取-1
     *  @param variable    变量名.不带前缀美元符号
     *  @param arr         数据数组.现只支持2维数组，且均需要设置key
     *                     文件中保存为输入的数组结构
     *                     如果操作类型是追加,可以是一条记录;如果是覆盖需要是全部的数据
     *  @param filename    文件名.如果文件名中没有".",自动增加后缀filetype
     *  @param filetype    文件类型.现在只支持php
     *  @param type        操作类型.1,追加;2,覆盖
     *  @param prefixpath  路径前缀.带斜杠"\"
     *  @param minfilesize 文件的最小值.依此判断是否为第一个变量
     *  @return int 1:操作成功;0:操作失败
     *
     */
    function operateFile($variable, $arr, $filename, $filetype = 'php', $type = 1, $prefixpath = '', $minfilesize = 100)
    {
        $header_str = "<?php \n !defined(\"IN_YCTOOL\") && exit(); ";
        $footer_str = "?>";

        //变量前缀
        $pre_variablename = "\$";

        $_variable = trim($variable);
        $_filename = trim($filename);
        $_filetype = trim($filetype);
        $_prefixpath = trim($prefixpath);

        //判断变量名是否为空
        if (strlen($_variable) <= 0)
        {
            //echo "variable为空";
            return 0;
        }

        $variablename = $pre_variablename . $_variable;

        $array_num = count($arr);
        if ($array_num <= 0)
        {
            //echo "arr为空";
            //return 0;
        }

        //得到对应的路径(不包含文件名)
        $path1 = $_prefixpath;//Func::getFilePath2($userid, $prefixpath);
        
        $all_path_nofilename = $path1;

        //如果filename中没有包含".",则增加
        $all_filename;
        $index = strpos($_filename, ".");
        if ($index > 0)
        {
            $all_filename = $_filename;
        }
        else
        {
            if (strlen($_filetype) > 0)
            {
                $all_filename = $_filename . "." . $_filetype;
            }
        }

        //得到全部的相对路径（包含文件名）
        $all_path = $all_path_nofilename . $all_filename;
        //echo "all_path=" . $all_path;

        $content;

        //是否为数组的第一个.1为第一个;0为不是第一个
        //判断文件大小。如果文件不存在，自然是第一个；如果存在，则如果没有超过100byte,是第一个;反之,不是第一个
        $isfirst = 0;
        if (!file_exists($all_path))
        {
            $isfirst = 1;
        }
        else
        {
            $fsize = filesize($all_path);
            if ($fsize < $minfilesize)
            {
                $isfirst = 1;
            }
        }
        
        //写文件
        if ($type == 1)//追加
        {
            $handle = fopen($all_path, "a");
		}   
        else//覆盖
        {
            $handle = fopen($all_path, "w");
            $isfirst = 1;
        }

        $i = 0;
		if($isfirst == 1)
		{
		    $content .= $header_str;
		}
		else
		{
		    $content .= "<?php ";
		}
	        $content .= "\n";
		if($arr)
		{
		    foreach ($arr as $key => $rowdata)
		    {
			if ($i == 0 && $isfirst == 1)
			{
			    $content .= $variablename . "=array(" . $key . "=>array(";
			}
			else
			{
			    $content .= $variablename . "[" . $key . "]=array(";
			}
	
			//判断是否有值.1为有值,0表示没有
			$haveValue = 0;
			if($rowdata)
			{
			    foreach ($rowdata as $key2 => $value)
			    {
				$content .= "'$key2'=>'$value',";
				if ($haveValue == 0)
				{
				    $haveValue = 1;
				}
			    }
			}
			//
			$content .= "'-1'=>''";
	
			if ($i == 0 && $isfirst == 1)
			{
			    $content .="));";
			}
			else
			{
			    $content .=");";
			}
	
			$content .= "\n";
	
			$i++;
		    }
		}
        $content .= $footer_str;
        $content .= "\n";

        if (!fwrite($handle, $content))
        {
            //echo "写入失败";
            fclose($handler);
            return 0;
        }

        //关闭文件
        fclose($handle);
        return 1;
    }

    /**
     *  本函数实现了目录大小的统计功能
     *  @param $dir 目录路径名
     */
    function directory_traverse($dir)
    {
        if (is_dir($dir)){   
            if($dir_handle = opendir($dir)){

                while (false !== ($file_name = readdir($dir_handle)) ){

                    $file_type = filetype($dir.'/'.$file_name);

                    if($file_name=='.' or $file_name =='..'){ 
                        continue;
                    }
                    else{
                        if('dir' == $file_type){  
           
                            $dir_size += self::directory_traverse($dir.'/'.$file_name);
                        }
                        elseif('file' == $file_type){
                      
                            $file_size += filesize($dir.'/'.$file_name); 
                  
                        }
                    }
                }
            }

        } elseif (is_file($dir)){
            $size = filesize($dir);
        }

        return $file_size + $dir_size;
    }

    //递归删除: $dirName目录下所有的文件及目录
    ////deltree('dirname');
    function deltree( $dirName )
    {
		if ( $handle = opendir( "$dirName" ) )
	       	{
		    while ( false !== ( $item = readdir( $handle ) ) ) 
		    {
				if ( $item != "." && $item != ".." )
			    {
				    if ( is_dir( "$dirName/$item" ) )
				    {
				    	self::delDirAndFile( "$dirName/$item" );
				    } 
				    else 
				    {
						return  unlink( "$dirName/$item" ) ;
				    }
				}
		    }
		    closedir( $handle );
		    return rmdir( $dirName ) ;
		}

    }
    

    //内容保存到文件 
    function writeFiles($filename, $filecontent)
    {
		$fp = fopen($filename, "w");
		fseek($fp,0);
		fputs($fp,$filecontent);
		fclose($fp);
    }

    //获取文件中的内容
    function readFiles($filename)
    {
		$fp = fopen($filename, 'r');
		$filecontent = fread($fp, filesize($filename));
		fclose($fp);
		return $filecontent;
    }

       
    /**
     * 对一个数组中的每一个个对象运用htmlspecialchars()函数，递归的。 
     *
     * @param array $array
     * @return array
     */
    function htmlspecialcharsArray(&$array)
    {
		if (is_array($array))
		{
		    foreach ($array as $key => $value)
		    {
				if (!is_array($value))
				{
				    $array[$key] = htmlspecialchars($value);
				}
				else
				{
				    self::htmlspecialcharsArray($array[$key]);
				}
		    }
		}
		else
		{
		    if (is_string($array))
		    {
				$array=htmlspecialchars($array);			
		    } 
		}
		return $array;
    }

    /**
     * 正规表达式例子(自动转化www,ftp,mail开头的链接) 
     *
     * @param array $array
     * @return array
     */
    function enableUrl($str)
    {
		// 自动转化www开头的链接
		$str = ereg_replace("(www.[a-zA-Z0-9@:%_.~#-\?&]+)", " <a href=\"linkHttp://\\1\" target=\"_blank\">\\1</a>", $str);
		//转化http://开头和ftp://开头的链接 
		$str = ereg_replace("(((f|ht){1}tp://)[a-zA-Z0-9@:%_.~#-\?&]+)", "<a href=\"\\1\" target=\"_blank\">\\1</a>", $str);
		$str = str_replace('linkHttp://','http://',$str); 
		// 转化邮件地址 
		$str = ereg_replace("([_\.0-9a-z-]+@([0-9a-z][0-9a-z-]+\.)+[a-z]{2,3})","<a href=\"mailto:\\1\">\\1</a>", $str);
		return $str;
    }
	
    /**
     * 对一个数组中的每一个个对象运用 自动转化www,ftp,mail开头的链接，递归的。 
     *
     * @param array $array
     * @return array
     */
    function enableUrlArray(&$array)
    {
		if (is_array($array))
		{
		    foreach ($array as $key => $value)
		    {
				if (!is_array($value))
				{
				    $array[$key] = self::enableUrl($value);
				}
				else
				{
				    self::enableUrlArray($array[$key]);
				}
		    }
		}
		else
		{
		    if (is_string($array))
		    {
		    	$array=self::enableUrl($array);			
		    } 
		}
		return $array;
    }

    /**
     * 对一个数组中的一个对象特殊字符替代。 
     *
     * @param array $sarr		    要替代的数组
     * @param array $key $strkey	    $key替代$strkey		
     * @return array
    */
    function strReplaceArray($sarr, $key, $strkey) 
    {
		if ($sarr) 
		{
		    $result = array();
		    foreach ($sarr as $value)
		    {
			$value = str_replace($key, $strkey, $value);
			$result[] = $value;
		    }
		    return $result;
		}
		else
		{
		    return $sarr;
		}
    }

    /**
     * 对一个数组中的一个对象长度截取。 
     *
     * @param array $sarr		要截取的数组
     * @param string $length 	截取的长度
     * @param array $key		截取的数组中此对象的键		
     * @return array
    */
    function subArray($sarr, $length, $keyvalue = '') 
    {
		if ($sarr) 
		{
		    $result = array();
		    foreach ($sarr as $value) 
		    {
			$value[$keyvalue] = substr($value[$keyvalue], 0, $length);
			$result[] = $value;
		    }
		    return $result;	
		}
		else
		{
		    return false;
		}
    }
	
    /**
     * 对一个数组中的一个对象长度截取并strip_tags。 
     *
     * @param array $sarr		要截取的数组
     * @param string $length 	截取的长度
     * @param array $key		截取的数组中此对象的键		
     * @return array
     */
    function subTagsArray($sarr, $length, $keyvalue = '') 
    {
		if ($sarr) 
		{
		    $result = array();
		    foreach ($sarr as $value) 
		    {
				$value[$keyvalue] = substr(strip_tags($value[$keyvalue]), 0, $length);
				$result[] = $value;
		    }
		    return $result;	
		}
		else
		{
			return false;
		}
    }

    /**
     * Enter description here...
     * 截取[英文系]字符串指定长度
     *
     * @param unknown_type $content
     * @param unknown_type $length
     * @return unknown
     */
    function subStrs($content, $length)
    {
		if($length && strlen($content) > $length)
		{
		    $num = 0;
		    for($i = 0; $i < $length - 3; $i++)
		    {
				if(ord($content[$i]) > 127)
				{
				    $num++;
				}
		    }
		    $num%2==1 ? $content=substr($content,0,$length-4):$content=substr($content,0,$length-3);
		    $content.='..';
		}
		return $content;
    }

    /**
     * 截取[夹带中文系]字符串指定长度
     *
     * @param string $sourcestr 是要处理的字符串
     * @param int $cutlength 为截取的长度(即字数)
     * @param int $havedot:截取后是否显示'...'
     * @return 截取后的字符串
     */
    function cutStr($sourcestr,$cutlength,$havedot=0) 
    { 
		$returnstr=''; 
		$i=0; 
		$n=0; 
		$str_length=strlen($sourcestr);//字符串的字节数 
		while (($n<$cutlength) and ($i<=$str_length)) 
		{ 
		   $temp_str=substr($sourcestr,$i,1); 
		    $ascnum=Ord($temp_str);//得到字符串中第$i位字符的ascii码 
		    if ($ascnum>=224)    //如果ASCII位高与224，
		    { 
				$returnstr=$returnstr.substr($sourcestr,$i,3); //根据UTF-8编码规范，将3个连续的字符计为单个字符         
				$i=$i+3;            //实际Byte计为3
				$n++;            //字串长度计1
		    }
		    elseif ($ascnum>=192) //如果ASCII位高与192，
		    { 
				$returnstr=$returnstr.substr($sourcestr,$i,2); //根据UTF-8编码规范，将2个连续的字符计为单个字符 
				$i=$i+2;            //实际Byte计为2
				$n++;            //字串长度计1
		    }
		    elseif ($ascnum>=65 && $ascnum<=90) //如果是大写字母，
		    { 
				$returnstr=$returnstr.substr($sourcestr,$i,1); 
				$i=$i+1;            //实际的Byte数仍计1个
				$n++;            //但考虑整体美观，大写字母计成一个高位字符
		    }
		    else                //其他情况下，包括小写字母和半角标点符号，
		    { 
				$returnstr=$returnstr.substr($sourcestr,$i,1); 
				$i=$i+1;            //实际的Byte数计1个
				$n=$n+0.5;        //小写字母和半角标点等与半个高位字符宽...
		    } 
		}
		if ($str_length > $cutlength)
		{
		    //省略号
		    if($havedot)
		    {
				$returnstr = $returnstr . "...";//超过长度时在尾处加上省略号
		    }
		    else
		    {
				return $returnstr;
		    }
		}
	    return $returnstr;	  
    }

    /**
     * 对一个数组中的一个对象长度截取（中文）< II >。 
     * 
     * @param array $sarr		要截取的数组 
     * @param string $length 	截取的长度
     * @param array $key		截取的数组中此对象的键		
     * @return array
     */
    function cutStrArray($sarr, $length, $keyvalue = '', $havedot=0) 
    {
		if ($sarr) 
		{
		    $result = array();
		    foreach ($sarr as $value) 
		    {
				$value[$keyvalue] = self::cutStr($value[$keyvalue], $length, $havedot);
				$result[] = $value;
		    }
		    return $result;	
		}
		else
		{
		    return false;
		}
    }
	
    /**
     * 和数据库相关时，过滤特殊字符 ' " 
     *
     * @param array $str		
     * @return string
     */
    function replaceQuotes($str) 
    {
		if ($str) 
		{
		    $str = str_replace('\'', "\"", $str);
		    $str = str_replace('\"', "`", $str);
		    return $str;
		}
		else
		{
		    return false;
		}
    }

    /**
     * 对字符串的特殊值进行替换
     *
     * @param unknown_type $msg
     * @return unknown
     */
    function trChar($msg)
    {
		$msg = stripslashes($msg);
		$msg = str_replace('\\','＼',$msg);
		$msg = str_replace('&','&amp;',$msg);
		$msg = str_replace('"','&quot;',$msg);
		$msg = str_replace("'",'&#39;',$msg);
		$msg = str_replace("<","&lt;",$msg);
		$msg = str_replace(">","&gt;",$msg);
		$msg = str_replace("\r","",$msg);
		return $msg;
    } 
    /**
     * 生成分页字符串。输入列表总数，当前页数，每页显示数，网址URL，它将来自动生成分页列表字符串。
     *
     * @param int $count		记录总数
     * @param int $page			页码，从1开始
     * @param int $per			每页显示记录数
     * @param string $url		网址，需要在这个网址上附加page=4这样的请求
     * @return string		返回分页字符串
     */
    public static function pageStr($count, $page, $per, $url)
    {
		$pre = 4;
		$next = 4;
	
		$sum = ceil($count/$per);
		($page > $sum && $page != 1) && self::ObHeader($url ."&page=$sum");
		 
		(!is_numeric($page) || $page < 1) && $page = 1;
		if ($sum < 1)
		{
		    return ;
		}
		else
		{

	    	$ret = "<style tape=\"text/css\">
 .quotes A {
	BORDER-RIGHT: #ddd 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #ddd 1px solid; PADDING-LEFT: 5px; PADDING-BOTTOM: 2px; BORDER-LEFT: #ddd 1px solid; COLOR: #aaa; MARGIN-RIGHT: 2px; PADDING-TOP: 2px; BORDER-BOTTOM: #ddd 1px solid; TEXT-DECORATION: none
}
 .quotes A:hover {
	BORDER-RIGHT: #a0a0a0 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #a0a0a0 1px solid; PADDING-LEFT: 5px; PADDING-BOTTOM: 2px; BORDER-LEFT: #a0a0a0 1px solid; MARGIN-RIGHT: 2px; PADDING-TOP: 2px; BORDER-BOTTOM: #a0a0a0 1px solid
}
 .quotes A:active {
	BORDER-RIGHT: #a0a0a0 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #a0a0a0 1px solid; PADDING-LEFT: 5px; PADDING-BOTTOM: 2px; BORDER-LEFT: #a0a0a0 1px solid; MARGIN-RIGHT: 2px; PADDING-TOP: 2px; BORDER-BOTTOM: #a0a0a0 1px solid
}
 .quotes SPAN.current {
	BORDER-RIGHT: #e0e0e0 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #e0e0e0 1px solid; PADDING-LEFT: 5px; FONT-WEIGHT: bold; PADDING-BOTTOM: 2px; BORDER-LEFT: #e0e0e0 1px solid; COLOR: #aaa; MARGIN-RIGHT: 2px; PADDING-TOP: 2px; BORDER-BOTTOM: #e0e0e0 1px solid; BACKGROUND-COLOR: #f0f0f0
}
 .quotes SPAN.disabled {
	BORDER-RIGHT: #f3f3f3 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #f3f3f3 1px solid; PADDING-LEFT: 5px; PADDING-BOTTOM: 2px; BORDER-LEFT: #f3f3f3 1px solid; COLOR: #ccc; MARGIN-RIGHT: 2px; PADDING-TOP: 2px; BORDER-BOTTOM: #f3f3f3 1px solid
}
</style>
";
		    $ret .= "<span class=\"disabled\">";
		    $prepage = $page-1 ;
		    $page != 1 && $ret .= "<a href=\"" . $url . "&page=$prepage\">";
		    $ret .= "&lt;";
		    $page != 1 && $ret .= "</a>";
		    $ret .= "</span>";


		    $pagestart0 = $page - $pre;
		    if($pagestart0 > 1 )
		    {
				$sum  > $pre && $ret .= "<a href='$url". "&page=1" ."'>1</a>";
		    }

		    $pagestart1 = $page - $pre - 1;
		    if($pagestart1 > 1 )
		    {
				$sum - 1 > $pre && $ret .= "<a href='$url". "&page=2" ."'>2</a>";
		    }

	   	 	$pagestart2 = $page - $pre - 2;
		    if($pagestart2 > 1)
		    {
				$ret .= " ...";
		    }

	    	$flag = 0;
		    for ($i = $page - $pre; $i <= min($sum, $page + $next); $i++)
		    {
				if ($i < 1)
				{
				    continue;
				}
				$ret .= $i == $page ? "<span class=\"current\">$page</span>" : "<a href='$url"."&page=$i"."'>$i</a>";
		    } 

	    	$pageend2 = $page + $next + 2;
		    if($pageend2 < $sum)
		    {
				$ret .= " ...";
		    }
		    $pageend0 = $page + $next;
		    $pageend1 = $page + $next + 1;
		    if($pageend1 < $sum )
		    {
				$sum1 = $sum-1;
				$sum - 1 > $pre && $ret .= "<a href='$url". "&page=$sum1" ."'>$sum1</a>";
		    }
		    if($pageend0 < $sum )
		    {
				$sum  > $pre && $ret .= "<a href='$url". "&page=$sum" ."'>$sum</a>";
		    }

		    $nextpage = $page+1 ;
		    $ret .= "<span class=\"disabled\">";
		    $page != $sum && $ret .= "<a href=\"" . $url . "&page=$nextpage\">";
		    $ret .= "&gt;";
		    $page != $sum && $ret .= "</a>";
		    $ret .= "</span>";
	
		     return $ret;
	    }
    }
}
?>
